package cn.tedu.charging.cost.pojo.po;

import lombok.AccessLevel;
import lombok.Data;
import lombok.experimental.FieldDefaults;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;

import java.math.BigDecimal;
/**
 * 存储充电数据的PO 用来做价格计算的 价格的累加 和 实际充电度数的计算
 * 解决 本地Map的问题
 */
@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
@Document(indexName = "charging_data_2407")
public class ChargingDataPO {

    @Id
    String id;

    /**
     * 次数
     */
    Integer count;

    /**
     * 用户id
     */
    Integer userId;

    /**
     * 订单号
     */
    String orderNo;

    /**
     * 枪id
     */
    Integer gunId;

    /**
     * 总费用
     */
    BigDecimal total;

    /**
     * 开始时间
     * 开始时间可以是
     * 订单创建的时间 也可以是 设备第一次同步的时间
     */
    Long startTime;

    /**
     * 通过充血模型 计算总花费
     * 好处 把计算花费的业务逻辑 内聚在 POJO ChargingData 中 而不是在 Service 中 高内聚 低耦合
     * 适合 复杂的业务场景
     * @param total
     */
    public void setTotal(BigDecimal total) {
        // 判断是否是第一次
        if (isFirst()) {
            // 第一次 直接赋值
            this.total = total;
        }else {
            // 不是第一次 用本次 加 上次
            this.total = this.total.add(total);
        }
    }

    /**
     * 充电度数
     */
    Float chargingCapacity;

    /**
     * 通过充血模型 计算本次充电度数
     * @param chargingCapacity
     * @return
     */
    public Float getChargingCapacity(Float chargingCapacity) {
        // 判断是否是第一次
        if (isFirst()) {
            // 第一次 直接返回
            return chargingCapacity;
        }else {
            // 不是第一次 用入参 本次同步的总度数 - 上次同步的总度数
            return chargingCapacity - this.chargingCapacity;
        }
    }

    /**
     * 判断同步的充电进度是否是第一次
     * 充血模型 在 POJO 数据类  里增加了业务方法
     * 贫血模型 反之 过去的写法 数据类 只有数据 没有任何的业务方法
     *
     * 又有数据，又有业务方法
     * DDD 领域驱动开发
     *
     * @return
     */
    public Boolean isFirst() {
        return count == 1;
    }


}
